//
//  BaseLiveViewController.h
//  BukaLive
//
//  Created by 曹飞 on 16/9/19.
//  Copyright © 2016年 曹飞. All rights reserved.
//  直播页面父类

#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>

#import <MBProgressHUD/MBProgressHUD.h>
#import <AFNetworking/AFNetworking.h>

#import <BukaSDKFoundation/BukaSDKFoundation.h>




#import "BKRoomModel.h"
#import "BKUserInfoModel.h"
#import "BKRoomBanModel.h"
#import "BKURLRoomInfoModel.h"


#import "BKUserExtend.h"


#import "BKUILayerLogTool.h"


#define TIMER_Int 1

#define RE_CONNECT_TIME 3  //重新登录次数
#define RE_PUBLISH_TIME 3  //重新发布次数
#define RE_PLAY_TIME 3     //重新播放次数
#define voteAnswerViewTAG 7000 //标记答题



//统一写入coredata，不单独记录了
//static NSString * const kBKLogBKSDK = @"sdkLog.log";  // 媒体调用日志 根据实际type传
//static NSString * const kBKLogGeneral = @"General.log"; //普通日志10条一传，或者发生错误的时候，或者指定传的时机
//static NSString * const kBKLogStream = @"sdkLogStream.log"; //备用



typedef NS_ENUM(NSInteger, CanSpeakType){
    CanSpeakTyepAll,
    CanSpeakTyepOne,
    CanSpeakTypeNone
};

@interface BKBaseLiveViewController : UIViewController <BukaRpcIODelegate,BukaPkgIODelegate,ChatDelegate,UserDelegate,StatusDelegate,ConnectDelegate,LogDelegate,BukaLogDelegate>



@property (nonatomic,strong) BKRoomModel * roomModel; //房间所有信息

@property (nonatomic,assign) int role;
@property (nonatomic,strong) NSString * signoUserID;
@property (nonatomic,strong) BKURLRoomInfoModel * tempRoomModel; //通过infoUrl获得并传入

@property (nonatomic,assign) NSInteger likeNum; //赞数量


@property (nonatomic,assign)    NSInteger iTime;
@property (nonatomic,weak)      NSTimer * timer;  //控制横竖屏切换的延时

@property (nonatomic, assign) BOOL isForeground; //默认前台 YES  NO 后台


@property (nonatomic, assign) BOOL allBan; //房间是否禁言
@property (nonatomic, assign) BOOL audioAllBan; //房间是否全体静音 进入房间的一个初始状态
@property (nonatomic, assign) BOOL isFrontCamera; //前后摄像头控制 默认是YES，前置
@property (nonatomic, assign) BOOL hasPublishVideo;        //记录是否推送视频
@property (nonatomic, assign) BOOL hasPublishAudio;        //记录是否推送声音
@property (nonatomic, assign) BOOL hasSelfPublishMic;   //记录自己是否屏蔽mic YES 使用，NO使用

@property (nonatomic, assign) BOOL isPortrait; //是否是竖屏，默认是YES
@property (nonatomic, assign) BOOL oneBan;     //我是否被禁言 ，默认是NO 根据房间状态变化


@property (nonatomic, assign) BOOL isSpeak;    //老师邀请某人了，任何人都不能举手了 ,默认是NO
@property (nonatomic, assign) BOOL isLike;     //某人进入房间时是否已经赞过了，默认是NO
@property (nonatomic, assign) BOOL isHandsUp; //是否已经举手发言了 默认是NO


@property (nonatomic,assign) BOOL isLockLandscape;          //在横屏状态下锁住左右方向 默认是NO

@property (nonatomic,assign) BOOL hasContentType3;          //是否有类型为3的流,默认是NO
@property (nonatomic,assign) BOOL isViewlocking;            //是否正在锁屏

@property (nonatomic,assign) BOOL hasPublishStream;         //专用挂起恢复是否发布流
@property (nonatomic,assign) BOOL isPublishing;             //发布只能一路，重复发布会崩溃，这个变量监听控制，保证发布过程不受干扰 默认是 NO 表示没有监听



/**
 ⚠️ 默认是NO ，解决关闭流的流程时，断线重连问题可能与发布的业务流程冲突，单纯靠发布流判断不能解决
 */
@property (nonatomic,assign) BOOL isDisable;

@property (nonatomic,strong) BukaStream * teacherHeadStream;
@property (nonatomic,strong) BukaStream * audioStream;


@property (nonatomic,assign) NSInteger rePublishTime; //当发布失败时重新发布次数
@property (nonatomic,assign) NSInteger rePlayTime; //当发布失败时重新发布次数
@property (nonatomic,assign) NSInteger reConnectTime; //登录信令失败时重新登录次数




@property (nonatomic,strong) NSString * pptJsonInfo; //老师端使用的，记录当前选中的h5档模型json形式

@property (nonatomic, strong) NSObject *loadingSyncObj; //防止异步操作


//@property (nonatomic,assign)BOOL audioBool03; //yes获取声音状态 每秒设置3次YES


//特殊任务进入后台需要挂起的，或者暂时不执行的操作，可以加到这里面执行，
-(void)addTaskToQueue:(void (^)(void))task;

#pragma mark - 重写方法
/**
 登录信令
 在某些情况下需要手动去连接一次，保证信令正常连接，一般不需要主动调用
 */
-(void)connetcSign;
//信令登陆成功，room为快照实体
-(void)loginSuccess:(Room*)room;

/**
 特殊情况下同步媒体功能，此方法在判断是否有摄像头和麦克风权限后执行，
 并设置好媒体委托等操作之后执行
 ⚠️如果是进来房间之后再登陆，请不要重写这个方法
 */
-(void)specialSynchronization;


/**
 网络状态的自行回调，如果需要进行网络处理，请重写这个方法
 @param status
 AFNetworkReachabilityStatusUnknown          = -1,
 AFNetworkReachabilityStatusNotReachable     = 0,
 AFNetworkReachabilityStatusReachableViaWWAN = 1,
 AFNetworkReachabilityStatusReachableViaWiFi = 2,
 
 */
-(void)netWorkStatus:(AFNetworkReachabilityStatus )status;
//统计网络状态
-(void)pingSummonry:(NSArray*)arr;

/**
 没有实际实现，回调之前会停止所有媒体活动，当网络状态不可链接时会有提醒，点确定回调，取消会自动退出房间，请重写,
 */
-(void)networkCloseStatRetry;

/**
 没有实际实现，回调之前会停止所有媒体活动，当手机蜂窝网络时回调，点确定回调，取消会自动退出房间，请重写
 */
-(void)networkNotWifi;


/**
 务必重写⚠️停止本地播放的流，以免再断线的情况下，流列表获取为空，停流流程不走
 */
-(void)stopLocalAllVideo;

#pragma mark - 监听前后台需要重写实现其他业务逻辑

/**
 进入前台 addTaskToQueue 的剩余任务开始执行
 */
-(void)BKApplicationBecomeActive:(NSNotification*)notification;

/**
 进入后台 addTaskToQueue 的剩余任务挂起
 */
-(void)BKApplicationEnterBackground:(NSNotification*)notification;

#pragma mark - 监听电话需要重写实现其他业务逻辑
/**
 监听到来电话或者打电话
 */
-(void)callStart;

/**
 电话操作结束
 */
-(void)callEnd;

#pragma mark - 监听设备方向
//监听设备方向
-(void)ListeningRotating;

//强制右转屏幕
- (void)ForceLandscapeRight;
//屏幕旋转，在这里处理页面布局
//- (void)LiveViewChangeConstraintsForceLandscapeRight;

//强制竖屏
- (void)ForcePortrait;
//屏幕旋转，在这里处理页面布局
//- (void)LiveViewChangeConstraintsForcePortrait;

//屏幕旋转，在这里处理页面布局
- (void)LiveViewChangeConstraints;
//串行处理切换摄像头
- (void)laterChangeCamera;




-(void)allBanAction:(BOOL)allBan
         withRoomID:(NSString *)roomid
         withUserID:(NSString*)userid; //废弃了


//判断是否能发言
-(CanSpeakType)canSpeak; //废弃了



/**
 退出房间清理
 */
-(void)logoutRoom:(void (^ __nullable)(void))completion;





#pragma mark - 日志存储


/**
 添加声音日志

 @param value 声音值
 @param aid_Vid aid_Vid
 */
-(void)addVolumValue:(long)value withAidVid:(NSString *)aid_Vid;

/**
 日志上传
 */
-(void)uplog;

/**
 本地存储日志

 @param level 1 正常 2 错误
 @param code 错误类型 参照BKUILayerLogTool.h
 @param log 日志json
 */
-(void)saveLog:(int)level code:(int)code log:(NSString *)log ;


/**
 本地存储正常的日志

 @param str 自行写字符串
 */
-(void)saveMethodLog:(NSString*)str;

@end
